package com.cskaoyan.controller;

import com.cskaoyan.bean.BaseRespVo;
import com.cskaoyan.bean.param.BaseParam;
import com.cskaoyan.bean.yangzihui.*;
import com.cskaoyan.config.zhangshizhi.CountTime;
import com.cskaoyan.service.AdService;
import org.apache.shiro.authz.annotation.Logical;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.validation.Valid;
import java.util.Date;

/**
 * @author yangzihui
 * @Description 推广管理模块中的优惠券管理的controller
 * @Create 2022-06-26 15:56
 * @Version
 */
@RestController
@RequestMapping("admin/coupon")
public class CouponController {
    @Autowired
    AdService adService;

    Date date = new Date();

    /**
     * 对优惠券信息的显示和查找
     *
     * @param baseParam
     * @param name
     * @param type
     * @param status
     * @return
     */
    @CountTime
    @RequiresPermissions(value = {"admin:coupon:list", "*"}, logical = Logical.OR)
    @RequestMapping("list")
    public BaseRespVo couponList(BaseParam baseParam, String name, Integer type, Integer status) {
        CouponData couponData = adService.list(baseParam, name, type, status);
        return BaseRespVo.ok(couponData);
    }

    /**
     * 新增一条优惠券信息
     *
     * @param newCoupon
     * @param bindingResult
     * @return
     */
    @CountTime
    @RequiresPermissions(value = {"admin:coupon:create", "*"}, logical = Logical.OR)
    @PostMapping("create")
    public BaseRespVo couponCreate(@Valid @RequestBody NewCoupon newCoupon, BindingResult bindingResult) {
        if (bindingResult.hasFieldErrors()) {
            FieldError fieldError = bindingResult.getFieldError();
            String defaultMessage = fieldError.getDefaultMessage();
            return BaseRespVo.invalidParameter(defaultMessage);
        }
        if (newCoupon.getTotal() == null) {
            return BaseRespVo.invalidParameter("参数不能为空");
        }
        if (newCoupon.getDays() != null && newCoupon.getDays() != 0 && newCoupon.getStartTime() != null && newCoupon.getEndTime() != null) {
            return BaseRespVo.invalidParameter("不能同时设置优惠券的有效天数和有效期");
        }
        if (newCoupon.getEndTime() != null && newCoupon.getEndTime().compareTo(date) == -1) {
            return BaseRespVo.invalidParameter("优惠券生效日期不合法");
        }
        if (Integer.parseInt(newCoupon.getTotal()) != 0 && Integer.parseInt(newCoupon.getLimit()) > Integer.parseInt(newCoupon.getTotal())) {
            return BaseRespVo.invalidParameter("参数不合法");
        }
        if ((newCoupon.getDays() == null || newCoupon.getDays() == 0) && newCoupon.getStartTime() == null && newCoupon.getEndTime() == null) {
            return BaseRespVo.invalidParameter("未设置优惠券时效信息");
        }
        if (newCoupon.getStartTime() != null && newCoupon.getEndTime() != null && newCoupon.getEndTime().compareTo(newCoupon.getStartTime()) == -1) {
            return BaseRespVo.invalidParameter("优惠券有效日期信息不合法");
        }
        if ((newCoupon.getDays() == null || newCoupon.getDays() == 0) && (newCoupon.getStartTime() == null || newCoupon.getEndTime() == null)) {
            return BaseRespVo.invalidParameter("请完善优惠券的有效日期");
        }
        if (Integer.parseInt(newCoupon.getMin()) < Integer.parseInt(newCoupon.getDiscount())) {
            return BaseRespVo.invalidParameter("消费金额不能小于满减金额");
        }
        Coupon coupon = adService.add(newCoupon);
        return BaseRespVo.ok(coupon);
    }

    /**
     * 删除一条优惠券
     *
     * @param coupon
     * @return
     */
    @CountTime
    @RequiresPermissions(value = {"admin:coupon:delete", "*"}, logical = Logical.OR)
    @PostMapping("delete")
    public BaseRespVo couponDelete(@RequestBody Coupon coupon) {
        adService.sub(coupon);
        return BaseRespVo.ok();
    }

    /**
     * 用户优惠券信息
     *
     * @param baseParam
     * @param couponId
     * @param status
     * @param userId
     * @return
     */
    @RequiresPermissions("*")
    @RequestMapping("listuser")
    public BaseRespVo listUser(BaseParam baseParam, Integer couponId, Integer status, Integer userId) {
        CouponUserData couponUserData = adService.listUser(baseParam, couponId, status, userId);
        return BaseRespVo.ok(couponUserData);
    }

    /**
     * 更新优惠券信息
     *
     * @param finalCoupon
     * @param bindingResult
     * @return
     */
    @CountTime
    @RequiresPermissions(value = {"admin:coupon:update", "*"}, logical = Logical.OR)
    @PostMapping("update")
    public BaseRespVo couponUpdate(@Valid @RequestBody FinalCoupon finalCoupon, BindingResult bindingResult) {
        if (bindingResult.hasFieldErrors()) {
            FieldError fieldError = bindingResult.getFieldError();
            String defaultMessage = fieldError.getDefaultMessage();
            return BaseRespVo.invalidParameter(defaultMessage);
        }
        if (finalCoupon.getTotal() == null) {
            return BaseRespVo.invalidParameter("参数不能为空");
        }
        if (finalCoupon.getDays() != null && finalCoupon.getDays() != 0 && finalCoupon.getStartTime() != null && finalCoupon.getEndTime() != null) {
            return BaseRespVo.invalidParameter("不能同时设置优惠券的有效天数和有效期");
        }
        if (finalCoupon.getEndTime() != null && finalCoupon.getEndTime().compareTo(date) == -1) {
            return BaseRespVo.invalidParameter("优惠券生效日期不合法");
        }
        if (Integer.parseInt(finalCoupon.getTotal()) != 0 && Integer.parseInt(finalCoupon.getLimit()) > Integer.parseInt(finalCoupon.getTotal())) {
            return BaseRespVo.invalidParameter("参数不合法");
        }
        if ((finalCoupon.getDays() == null || finalCoupon.getDays() == 0) && finalCoupon.getStartTime() == null && finalCoupon.getEndTime() == null) {
            return BaseRespVo.invalidParameter("未设置优惠券时效信息");
        }
        if (finalCoupon.getStartTime() != null && finalCoupon.getEndTime() != null && finalCoupon.getEndTime().compareTo(finalCoupon.getStartTime()) == -1) {
            return BaseRespVo.invalidParameter("优惠券有效日期信息不合法");
        }
        if ((finalCoupon.getDays() == null || finalCoupon.getDays() == 0) && (finalCoupon.getStartTime() == null || finalCoupon.getEndTime() == null)) {
            return BaseRespVo.invalidParameter("请完善优惠券的有效日期");
        }
        if (Integer.parseInt(finalCoupon.getMin()) < Integer.parseInt(finalCoupon.getDiscount())) {
            return BaseRespVo.invalidParameter("消费金额不能小于满减金额");
        }
        FinalFinalCoupon finalFinalCoupon = adService.modify(finalCoupon);
        return BaseRespVo.ok(finalFinalCoupon);
    }

    /**
     * 详情页面
     *
     * @param id
     * @return
     */
    @CountTime
    @RequiresPermissions(value = {"admin:coupon:read", "*"}, logical = Logical.OR)
    @RequestMapping("read")
    public BaseRespVo couponRead(Integer id) {
        Integer timeType = adService.selectTimeType(id);
        if (timeType == 0) {
            Coupon coupon = adService.read(id);
            return BaseRespVo.ok(coupon);
        } else if (timeType == 1) {
            FinalCoupon finalCoupon = adService.newRead(id);
            return BaseRespVo.ok(finalCoupon);
        } else {
            return BaseRespVo.invalidParameter("数据异常");
        }
    }
}
